<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Component Object Model</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Component_Object_Model"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Component_Object_Model rootpage-Component_Object_Model skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Component Object Model</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p>Das <b>Component Object Model</b> [<style data-mw-deduplicate="TemplateStyles:r227981795">
/* start https://de.wikipedia.org/ */
.mw-parser-output .IPA a{text-decoration:none}
/* end https://de.wikipedia.org/ */
</style><span class="navigation-not-searchable"><span class="IPA"><a href="Liste_der_IPA-Zeichen" title="Liste der IPA-Zeichen"><span title="Aussprache im Internationalen Phonetischen Alphabet (IPA)" lang="zxx">kəmˈpoʊnənt ˈɒbdʒɪkt ˈmɒdl</span></a></span></span>] (abgekürzt <b>COM</b>) ist eine von <a href="Microsoft" title="Microsoft">Microsoft</a> entwickelte Technik zur <a href="Interprozesskommunikation" title="Interprozesskommunikation">Interprozesskommunikation</a> unter <a href="Windows" class="mw-redirect" title="Windows">Windows</a>. COM-Komponenten können sowohl in Form von <a href="Dynamic_Link_Library" title="Dynamic Link Library">Laufzeitmodulen</a> (DLLs) als auch als ausführbare Programme umgesetzt sein. COM soll eine leichte Wiederverwendung von bereits geschriebenem Programmcode ermöglichen, zum Teil auch über Betriebssystemgrenzen hinweg. COM-Komponenten können unabhängig von der Programmiersprache eingesetzt werden.
</p><p>Das Component Object Model wurde von Microsoft 1992 mit der grafischen Benutzeroberfläche <a href="Windows_3.1" class="mw-redirect" title="Windows 3.1">Windows 3.1</a> eingeführt.
</p>
<div class="mw-heading mw-heading2"><h2 id="Architektur">Architektur</h2></div>
<p>COM basiert auf dem <a href="Client-Server-Modell" title="Client-Server-Modell">Client-Server-Modell</a>. Ein COM-Client erzeugt eine COM-Komponente in einem sogenannten COM-Server und nutzt die Funktionalität des Objektes über COM-Schnittstellen. Der Zugriff auf Objekte wird innerhalb eines Prozesses durch sogenannte COM-Apartments synchronisiert.
</p>
<div class="mw-heading mw-heading3"><h3 id="COM-Server">COM-Server</h3></div>
<p>Unter einem COM-Server versteht man ein Laufzeitmodul (<a href="Dynamic_Link_Library" title="Dynamic Link Library">Dynamic Link Library</a>) oder ein ausführbares Programm, das in einer COM-unterstützenden Programmiersprache erstellt wurde und COM-Komponenten anbietet und erstellen kann. Es gibt drei Typen von COM-Servern:
</p>
<div class="mw-heading mw-heading4"><h4 id="In-process-Server">In-process-Server</h4></div>
<p>Im Falle des <i>In-process-Servers</i> ist die COM-Komponente in einer <a href="Dynamic_Link_Library" title="Dynamic Link Library">DLL</a> implementiert (sie tragen unter Windows oft die Dateiendung <i><a href="OCX" title="OCX">OCX</a></i>). Diese DLLs müssen die Funktionen <code>DllGetClassObject()</code>, <code>DllCanUnloadNow()</code>, <code>DllRegisterServer()</code> und <code>DllUnregisterServer()</code> exportieren.
Wird eine COM-Komponente eines In-process-Servers erzeugt, so wird der zugehörige Server (ein Server kann mehrere COM-Komponenten anbieten) in den <a href="Prozess_(Informatik)" title="Prozess (Informatik)">Prozess</a> des Clients geladen. In-process-Server sind besonders schnell, da der Zugriff auf die Funktionen der COM-Komponenten ohne Umwege erfolgt. Nachteilig ist, dass auf diese Weise jeder Prozess eigenen Speicherplatz mit den benutzten COM-Komponenten belegt und keine gemeinsame Speichernutzung möglich ist.
<a href="ActiveX" title="ActiveX">ActiveX</a> verwendet dieses Modell.
</p>
<div class="mw-heading mw-heading4"><h4 id="Local_Server">Local Server</h4></div>
<p><i>Local Server</i> sind unter Windows ausführbare Programme, die COM-Komponenten implementieren. Bei der Erzeugung einer COM-Komponente wird dieses Programm gestartet (sofern es nicht schon läuft) – dies bedeutet, dass ein ausführbares Programm vorliegen muss, eine DLL kann hier nicht aufgerufen werden. Zur Kommunikation zwischen Client und Server wird ein vereinfachtes RPC-Protokoll (<a href="Remote_Procedure_Call" title="Remote Procedure Call">Remote Procedure Call</a>) benutzt. Local Server haben den Vorteil, dass sie nur einmal gestartet werden müssen und dann viele Clients bedienen können, was weniger Speicherplatz belegt. Zudem lassen sich so recht leicht Datenzugriffe auf einen gemeinsamen Datenbestand synchronisiert von mehreren laufenden Clients durchführen (wie zum Beispiel in <a href="Microsoft_Outlook" title="Microsoft Outlook">Microsoft Outlook</a>). Die Zugriffe über RPC sind allerdings langsamer.
</p>
<div class="mw-heading mw-heading4"><h4 id="Remote_Server">Remote Server</h4></div>
<p>Befinden sich Server und Client in einem <a href="Rechnernetz" title="Rechnernetz">Rechnernetz</a>, so kommt <a href="Distributed_Component_Object_Model" title="Distributed Component Object Model">DCOM</a> (<i>Distributed COM</i>) zum Einsatz. Der Einsatz von DCOM ermöglicht grundsätzlich den Betrieb von Server und Client auf unterschiedlichen Betriebssystemen.
</p><p>DCOM benutzt im Gegensatz zum Local Server ein vollständig implementiertes RPC, was die Aufrufe jedoch (auch bei sehr geringer Netzwerkauslastung) deutlich verlangsamt. Die Implementierung vom DCOM unterscheidet sich von der von COM mit Local Server zusätzlich noch durch den vorgeschalteten <a href="Protokollstack" class="mw-redirect" title="Protokollstack">Protokollstack</a>.
</p>
<div class="mw-heading mw-heading3"><h3 id="COM-Schnittstelle">COM-Schnittstelle</h3></div>
<p>Die COM-Schnittstelle dient der Kommunikation zwischen Client und Server. Eine COM-Komponente kann dazu über allgemein definierte und vorgegebene Schnittstellen (zum Beispiel IUnknown, IDispatch) sowie über spezielle Schnittstellen angesprochen werden.
</p><p>Jede Schnittstelle hat eine weltweit eindeutige Identifikationsnummer, die <a href="Globally_Unique_Identifier" class="mw-redirect" title="Globally Unique Identifier">GUID</a> (<i>Globally Unique Identifier</i>). Dadurch können auch mehrere Schnittstellen mit demselben Namen existieren (aber nicht mit derselben GUID).
</p><p>Um eine programmiersprachenübergreifende Client/Server-Kommunikation zu ermöglichen, findet an der Schnittstelle das sogenannte <i><a href="Marshalling" title="Marshalling">Marshalling</a></i> statt, das die auszutauschenden Daten in eine vordefinierte Binärrepräsentation wandelt.
</p><p>Eine <a href="Schnittstelle_(Objektorientierung)" title="Schnittstelle (Objektorientierung)">Schnittstelle</a> erfüllt die Funktion einer <a href="Abstrakte_Klasse" title="Abstrakte Klasse">abstrakten Klasse</a>, die lediglich virtuelle Elementfunktionen enthält, die (wegen der Trennung von Deklaration und Implementierung) in der <a href="VTable" class="mw-redirect" title="VTable">VTable</a> alle auf 0 gesetzt werden. Die C-Version einer Schnittstelle ist entsprechend eine <a href="Struct" class="mw-redirect" title="Struct">Struktur</a>, die <a href="Funktionszeiger" class="mw-redirect" title="Funktionszeiger">Funktionszeiger</a> enthält. Die erzeugten COM-Objekte nutzt man dabei über <a href="Zeiger_(Informatik)" title="Zeiger (Informatik)">Zeiger</a> auf deren Schnittstellen.
</p><p>Wenn ein COM-Objekt eine Schnittstelle implementiert, muss es alle Methoden der Schnittstelle überschreiben, also die VTable füllen. Dabei sind mindestens die drei Methoden von <code>IUnknown</code> zu implementieren, die für das Lebenszyklusmanagement zuständig sind und eventuell vorhandene, weitere implementierte Schnittstellen offenlegen.
</p><p>Eine Schnittstelle sieht in der für COM-Komponenten nutzbaren <a href="Interface_Definition_Language" class="mw-redirect" title="Interface Definition Language">IDL</a> (<i>Interface Definition Language</i>) wie folgt aus (als Beispiel dient das Interface <code>IUnknown</code>):
</p>
<div class="mw-highlight mw-highlight-lang-idl mw-content-ltr" dir="ltr"><pre><span></span><span class="o">//</span><span class="w"> </span>Standardschnittstelle<span class="w"> </span>aller<span class="w"> </span>COM<span class="o">-</span>Komponenten
[
<span class="w"> </span>object,
<span class="w"> </span>uuid(<span class="mi">00000000</span><span class="o">-</span><span class="mi">0000</span><span class="o">-</span><span class="mi">0000</span><span class="o">-</span>C000<span class="o">-</span><span class="mi">000000000046</span>)
]
interface<span class="w"> </span>IUnknown<span class="w"> </span>{
<span class="w"> </span>[restricted]
<span class="w"> </span>HRESULT<span class="w"> </span>_stdcall<span class="w"> </span>QueryInterface([in]<span class="w"> </span>GUID<span class="o">*</span><span class="w"> </span>rrid,<span class="w"> </span>[out]<span class="w"> </span>void<span class="o">**</span><span class="w"> </span>ppvObj);
<span class="w"> </span>[restricted]
<span class="w"> </span>unsigned<span class="w"> </span><span class="nb">long</span><span class="w"> </span>_stdcall<span class="w"> </span>AddRef();
<span class="w"> </span>[restricted]
<span class="w"> </span>unsigned<span class="w"> </span><span class="nb">long</span><span class="w"> </span>_stdcall<span class="w"> </span>Release();
}
</pre></div>
<p>Jede Schnittstelle muss über eine Schnittstellen-Vererbung die Funktionen der hier gezeigten Schnittstelle <code>IUnknown</code> definieren, da dieses die grundlegenden Funktionen für COM implementiert. Eine weitere <a href="Vererbung_(Programmierung)" title="Vererbung (Programmierung)">Vererbung</a> der Schnittstellendefinitionen ist möglich.
</p><p>Da Programmiersprachen wie <a href="Visual_Basic_Script" title="Visual Basic Script">Visual Basic Script</a> keine Typen kennen, hat Microsoft eine weitere Möglichkeit entwickelt, Funktionen aus COM-Schnittstellen aufzurufen. Für diese Möglichkeit muss die Schnittstelle die Funktionen der Schnittstelle <code>IDispatch</code> definieren. Dies ermöglicht es, eine COM-Komponente über <code>IDispatch.Invoke()</code> anzusprechen, ohne dass der COM-Client die <a href="Typbibliothek" title="Typbibliothek">Typbibliothek</a> des Servers kennen muss. Da der Zugriff über das Dispatch-Interface sehr viel langsamer als der Zugriff über ein typisiertes Interface ist, wird oft beides implementiert (<i>Dual Interface</i>), so dass bei Programmiersprachen, die <a href="Zeiger_(Informatik)" title="Zeiger (Informatik)">Zeiger</a> beherrschen, beide Zugriffsmöglichkeiten zur Verfügung stehen.
</p>
<div class="mw-heading mw-heading3"><h3 id="COM-Komponente">COM-Komponente</h3></div>
<p>Eine COM-Komponente bietet die aufrufbaren Funktionen über eine oder mehrere COM-Schnittstellen an. Die Erzeugung des Objektes erfolgt durch die Implementierung von <code>IClassFactory.CreateInstance()</code> im COM-Server.
</p><p>Die Lebensdauer eines Objektes wird mittels <a href="Referenzz%C3%A4hlung" title="Referenzzählung">Referenzzählung</a> gesteuert. Eine COM-Komponente lebt nur so lange, wie die Differenz der Aufrufe von <code>AddRef()</code> (am Beginn der Verwendung einer Instanz) und <code>Release()</code> (Freigabe nach Verwendung der Instanz) nicht 0 ergibt.
</p><p>Eine COM-Komponente kann mehrere Schnittstellen anbieten. Dies ist in bestimmten Situationen auch notwendig, um ein Programm erweitern zu können, ohne andere Programme neu kompilieren zu müssen, denn der Compiler kodiert die aus der VTable gelesenen Einsprungadressen der vom Client aufgerufenen Funktionen unter bestimmten Umständen fest. Wird die Schnittstelle einer Komponente später geändert, kann sich die Einsprungadresse ändern, was die Funktionstüchtigkeit des Clients beeinträchtigen würde. Zur Erweiterung der Serverfunktionalität wird also stattdessen eine weitere Schnittstelle implementiert.
</p><p>Eine Vererbung von COM-Komponenten (<i>Aggregation</i>) ist durch die Anforderungen der Binärkompatibilität nur in wenigen Programmiersprachen möglich. Dazu wird die zu vererbende Komponente über explizite Durchleitung der Schnittstellen über die erbende Komponente veröffentlicht.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="COM-Client">COM-Client</h3></div>
<p>Der Client ist das Programm, das
</p>
<ul><li>möglicherweise ein Objekt einer COM-Komponente über einen COM-Server erzeugt und</li>
<li>die von der COM-Komponente angebotenen Funktionen benutzt.</li></ul>
<p>Der Client kennt die Funktionen, die von der COM-Komponente angeboten werden, da diese in den entsprechenden COM-Schnittstellen deklariert sind. Die Veröffentlichung von Schnittstellen erfolgt entweder über Typbibliotheken oder Beschreibungen in der <a href="Interface_Definition_Language" class="mw-redirect" title="Interface Definition Language">IDL</a> (<i>Interface Definition Language</i>).
</p>
<div class="mw-heading mw-heading3"><h3 id="Apartments">Apartments</h3></div>
<p>COM-Objekte werden bei der Erzeugung immer einem sogenannten Apartment zugeordnet. Dabei handelt es sich um transparente Rahmen, die zur Synchronisierung von Methodenaufrufen mehrerer Objekte dienen, die mit unterschiedlichen Anforderungen an die <a href="Threadsicherheit" title="Threadsicherheit">Threadsicherheit</a> arbeiten. Wird COM nicht mitgeteilt, dass eine entsprechende Komponente threadsicher ist, wird COM nur einen Aufruf gleichzeitig an ein Objekt erlauben. Threadsichere Komponenten können auf jedem Objekt beliebig viele Aufrufe gleichzeitig ausführen.
</p><p>Geschieht ein Aufruf im gleichen Apartment zwischen verschiedenen Objekten, ist kein Marshalling erforderlich. Wird jedoch eine Schnittstelle über Apartmentgrenzen hinweg benutzt, muss ein Marshalling erfolgen.
</p><p>Jeder Thread, der COM verwenden möchte, muss sich vor der ersten Verwendung einer COM-Funktionalität einem Apartment zuordnen (MTA) oder ein neues Apartment erstellen (STA). Dies geschieht über die Funktion <code>CoInitialize()</code>. Programmiersprachen mit integrierter COM-Unterstützung (zum Beispiel VB6 und die meisten <a href=".Net-Framework" title=".Net-Framework">.Net-Framework</a>-Sprachen) führen diese Zuordnung oft automatisch durch.
</p><p>Jede COM-Komponente wird bei Erzeugung einem Apartment zugeordnet. Falls die Apartment-Anforderungen der erzeugten Komponente zum Apartment des erzeugenden Threads passen, wird das Objekt dem gleichen Apartment zugeordnet. Bei Aufrufen über Prozessgrenzen hinweg liegen die beiden Objekte immer in verschiedenen Apartments. Die Zuordnung zu einem Apartment kann während der Lebensdauer des Objektes nicht geändert werden.
</p><p>Es gibt drei Arten von Apartments:<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p>
<ul><li>Single Threaded Apartments (STA) besitzen genau einen Thread und beliebig viele Objekte. Es können beliebig viele STAs in einem Prozess existieren. Es erfolgt nur ein Aufruf gleichzeitig an das aufzurufende Objekt. Die restlichen Aufrufe warten in einer Warteschlange auf die Freigabe des Apartment-Threads. Dies impliziert, dass zwei Objekte in demselben STA auch von zwei verschiedenen Clients nicht parallel aufgerufen werden können. Als Besonderheit wird das erste in einem Prozess initialisierte STA automatisch zum Main-STA. Pro Prozess gibt es nur genau ein Main-STA; alle Objekte, die keine explizite Anforderung an das Apartment stellen, werden in diesem erzeugt.</li>
<li>Multi Threaded Apartments (MTA) besitzen beliebig viele Threads. Es gibt in einem Prozess allerdings maximal ein MTA. Dadurch können von mehreren Clients gleichzeitig Aufrufe an das gleiche oder auch verschiedene Objekte erfolgen. Die Anforderungen an die Implementierung der Komponenten sind wegen der notwendigen Threadsicherheit und Reentranz sehr hoch.</li>
<li>Neutral Threaded Apartments (NTA) haben keine Threadaffinität. Es gibt in einem Prozess allerdings maximal ein NTA. Jedes Objekt in einem NTA kann von einem STA/MTA Apartment ohne Threadübergang aufgerufen werden. Der Thread wird also kurzzeitig in das NTA ausgeliehen, um damit aus Performancegründen das Marshalling zu überspringen. Neutral Threaded Apartments wurde mit Windows 2000 eingeführt, um die Vorzüge von MTA (meist kein Marshalling notwendig) mit den Vorzügen von STA (keine threadsichere Implementierung notwendig) zu vereinen.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Funktionalität"><span id="Funktionalit.C3.A4t"></span>Funktionalität</h2></div>
<p>Durch den Einsatz von COM gibt es die Möglichkeiten
</p>
<ul><li>sprachunabhängig,</li>
<li>versionsunabhängig,</li>
<li>plattformunabhängig,</li>
<li>objektorientiert,</li>
<li>ortsunabhängig,</li>
<li>automatisierend</li></ul>
<p>zu programmieren.
Viele der Funktionen des „Windows Platform <a href="Software_Development_Kit" title="Software Development Kit">SDKs</a>“ sind über COM zugänglich. COM ist die Basis, auf der <a href="Object_Linking_and_Embedding" title="Object Linking and Embedding">OLE-Automation</a> und <a href="ActiveX" title="ActiveX">ActiveX</a> aufbauen. Mit der Einführung des <a href=".Net-Framework" title=".Net-Framework">.NET</a>-Frameworks verfolgte Microsoft allerdings die Strategie, COM unter Windows durch dieses Framework abzulösen. Im Folgenden werden die einzelnen Punkte der Aufzählung genauer erläutert.
</p>
<div class="mw-heading mw-heading3"><h3 id="Sprachunabhängigkeit"><span id="Sprachunabh.C3.A4ngigkeit"></span>Sprachunabhängigkeit</h3></div>
<p>COM-Komponenten sind unabhängig von der Programmiersprache. COM unterstützt den sogenannten <a href="Bin%C3%A4rstandard" class="mw-redirect" title="Binärstandard">Binärstandard</a>. Die erzeugte Binärdatei stellt einerseits die implementierten Funktionen zur Verfügung und andererseits eine <a href="Schnittstelle_(Objektorientierung)" title="Schnittstelle (Objektorientierung)">Schnittstelle</a>, die diese Funktionen aufzeigt. Mit Hilfe der Schnittstelle ist es möglich, von anderen Programmen aus die Funktionen zu verwenden. Dabei wird mit Konzepten aus dem Bereich <a href="Verteiltes_System" title="Verteiltes System">Verteilte Systeme</a> gearbeitet.
</p>
<div class="mw-heading mw-heading3"><h3 id="Versionsunabhängigkeit"><span id="Versionsunabh.C3.A4ngigkeit"></span>Versionsunabhängigkeit</h3></div>
<p>Ein weiterer Vorteil beim Einsatz von COM ist es, dass man die Verwaltung von neuen Softwarefeatures einfach in eine bestehende Anwendung integrieren kann. Oftmals kann es Probleme geben, wenn man herstellerneutrale oder herstellerübergreifende Softwarekomponenten mit weiteren Funktionen ausstattet. Dadurch kann zwar die eigene Software erweitert werden, jedoch besteht die Gefahr, dass andere Software, die ebenfalls die herstellerübergreifenden Komponenten verwendet, nicht mehr funktionsfähig bleibt.
</p><p>COM bietet eine robuste Möglichkeit an, um eine Softwarekomponente mit neuen Funktionen zu erweitern. Dies wird dadurch ermöglicht, dass mehrere Schnittstellen in einer <a href="Header-Datei" title="Header-Datei">Header-Datei</a> zusammengefasst werden können. Der folgende <a href="C%2B%2B" title="C++">C++</a>-Programmcode verdeutlicht dies:
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">//</span>
<span class="c1">// Interface mathematik.h</span>
<span class="c1">//</span>
<span class="k">class</span><span class="w"> </span><span class="nc">IStandardMathFunctions</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">IUnknown</span>
<span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="w"> </span><span class="n">STDMETHOD</span><span class="p">(</span><span class="n">Addieren</span><span class="p">)(</span><span class="kt">long</span><span class="p">,</span><span class="w"> </span><span class="kt">long</span><span class="p">,</span><span class="w"> </span><span class="kt">long</span><span class="o">*</span><span class="p">)</span>
<span class="w"> </span><span class="n">STDMETHOD</span><span class="p">(</span><span class="n">Subtrahieren</span><span class="p">)(</span><span class="kt">long</span><span class="p">,</span><span class="w"> </span><span class="kt">long</span><span class="p">,</span><span class="w"> </span><span class="kt">long</span><span class="o">*</span><span class="p">)</span>
<span class="p">};</span>
<span class="k">class</span><span class="w"> </span><span class="nc">IAdvancedMathFunctions</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">IUnknown</span>
<span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="w"> </span><span class="n">STDMETHOD</span><span class="p">(</span><span class="n">Fibonacci</span><span class="p">)(</span><span class="kt">short</span><span class="p">,</span><span class="w"> </span><span class="kt">long</span><span class="o">*</span><span class="p">)</span>
<span class="p">}</span>
</pre></div>
<p>Diese <a href="Header-Datei" title="Header-Datei">Header-Datei</a> namens <code>mathematik.h</code> enthält zwei Schnittstellen. Die erste Schnittstelle könnte beispielsweise die herstellerübergreifenden Funktionen anbieten, die von verschiedenen Programmen verwendet werden. Durch die zweite Schnittstelle <code>IAdvancedMathFunctions</code> wird diese Softwarekomponente erweitert. Weitere Schnittstellen können jederzeit hinzugefügt werden. Die alten Schnittstellen und darin enthaltenen Funktionen gehen dabei nicht verloren. Das Hinzufügen neuer Schnittstellen statt des Veränderns derselben ist so die von Microsoft gedachte Form, Softwarekomponenten zu erweitern, da so keine Inkonsistenzen entstehen.
</p>
<div class="mw-heading mw-heading3"><h3 id="Plattformunabhängigkeit"><span id="Plattformunabh.C3.A4ngigkeit"></span>Plattformunabhängigkeit</h3></div>
<p>x64-Applikationen können dank Marshalling auf 32-bittige COM-Server zugreifen (und umgekehrt). Der COM-Server muss dann in einem eigenen Prozess laufen und seine Objekte können demnach nicht als In-process-Server instanziiert werden. COM-Applikationen sind jedoch fast ausschließlich auf die Windows-Betriebssystemfamilie und von dieser unterstützte Hardware angewiesen, eine Plattformunabhängigkeit war konzipiert<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>, wurde aber wohl nur in wenigen Ausnahmefällen realisiert.
</p>
<div class="mw-heading mw-heading3"><h3 id="Objektorientierung">Objektorientierung</h3></div>
<p>Beim Einsatz von COM wird <i><a href="Objektorientierte_Programmierung" title="Objektorientierte Programmierung">objektorientiert</a></i> gearbeitet. Trotzdem können COM-Komponenten auch zum Beispiel in C erstellt und genutzt werden, da die <a href="Schnittstelle_(Objektorientierung)" title="Schnittstelle (Objektorientierung)">Schnittstellen</a> tatsächlich eine Sammlung von <a href="Funktionszeiger" class="mw-redirect" title="Funktionszeiger">Funktionszeigern</a> sind (<a href="Abstrakte_Klasse" title="Abstrakte Klasse">abstrakte Klasse</a> in <a href="C%2B%2B" title="C++">C++</a>, <a href="Struct" class="mw-redirect" title="Struct">struct</a> in <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a>).
</p>
<div class="mw-heading mw-heading3"><h3 id="Ortsunabhängigkeit"><span id="Ortsunabh.C3.A4ngigkeit"></span>Ortsunabhängigkeit</h3></div>
<p>COM ist <i>ortsunabhängig</i>, d. h., dass die einzelnen COM-Komponenten an einer zentralen Stelle <i>(<a href="Registrierungsdatenbank" title="Registrierungsdatenbank">Registrierungsdatenbank</a>)</i> angemeldet werden und so der Zugriff auf die Komponenten unabhängig von ihrem eigentlichen Ort erfolgen kann.
</p>
<div class="sieheauch" role="navigation" style="font-style:italic;"><span class="sieheauch-text">Siehe auch</span>: <a href="Ortstransparenz" title="Ortstransparenz">Ortstransparenz</a></div>
<div class="mw-heading mw-heading3"><h3 id="Automatisierung">Automatisierung</h3></div>
<p>Das Steuern von Anwendungen über COM-Schnittstellen wird als Automatisierung bezeichnet. Von dieser Anwendungsmöglichkeit wird häufig im Rahmen von OLE (<a href="Object_Linking_and_Embedding" title="Object Linking and Embedding">Object Linking and Embedding</a>) Gebrauch gemacht.
</p>
<div class="mw-heading mw-heading2"><h2 id="Sicherheit">Sicherheit</h2></div>
<p>Durch eine Sicherheitslücke in der RPC-Implementierung von DCOM wurde die Angriffsweise des bekannten Wurms <a href="W32.Blaster" class="mw-redirect" title="W32.Blaster">W32.Blaster</a> möglich.
</p>
<div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2></div>
<ul><li><a href="Object_Linking_and_Embedding" title="Object Linking and Embedding">Object Linking and Embedding</a></li>
<li><a href="Objektorientierte_Programmierung" title="Objektorientierte Programmierung">Objektorientierte Programmierung</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Peter Loos: <i>Go to COM. Das Objektmodell im Detail betrachtet</i>. 1. Auflage. Addison-Wesley, 2000, ISBN 978-3-8273-1678-3</li>
<li>Olaf Zwintzscher: <i>Software-Komponenten im Überblick. Einführung, Klassifizierung & Vergleich von JavaBeans, EJB, COM+, .Net, CORBA, UML 2.</i> W3L, Herdecke 2005, ISBN 3-937137-60-2</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><i><a rel="nofollow" class="external text" href="https://learn.microsoft.com/en-us/windows/win32/com/component-object-model--com--portal">Component Object Model (COM)</a></i> Microsoft</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://archive.md/20130128143928/http://msdn.microsoft.com/de-de/library/xfb1zk2x(VS.80).aspx"><i>COM_INTERFACE_ENTRY Macros.</i></a> Archiviert vom <style data-mw-deduplicate="TemplateStyles:r250917974">
/* start https://de.wikipedia.org/ */
.mw-parser-output .dewiki-iconexternal>a{background-position:center right!important;background-repeat:no-repeat!important}body.skin-minerva .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/OOjs_UI_icon_external-link-ltr-progressive.svg")!important;background-size:10px!important;padding-right:13px!important}body.skin-timeless .mw-parser-output .dewiki-iconexternal>a,body.skin-monobook .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/MediaWiki_external_link_icon.svg")!important;padding-right:13px!important}body.skin-vector .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/Link.ernal-small-ltr-progressive.svg")!important;background-size:0.857em!important;padding-right:1em!important}
/* end https://de.wikipedia.org/ */
</style><span class="dewiki-iconexternal"><a class="external text" href="https://redirecter.toolforge.org/?url=http%3A%2F%2Fmsdn.microsoft.com%2Fde-de%2Flibrary%2Fxfb1zk2x%28VS.80%29.aspx">Original</a></span><span>;</span><span class="Abrufdatum"> abgerufen am 1. Juli 2023</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rfr_id=info%3Asid%2Fde.wikipedia.org%3AComponent+Object+Model&rft.title=COM_INTERFACE_ENTRY+Macros&rft.description=COM_INTERFACE_ENTRY+Macros&rft.identifier=https%3A%2F%2Farchive.md%2F20130128143928%2Fhttp%3A%2F%2Fmsdn.microsoft.com%2Fde-de%2Flibrary%2Fxfb1zk2x%28VS.80%29.aspx&rft.source=http://msdn.microsoft.com/de-de/library/xfb1zk2x(VS.80).aspx"> </span></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://archive.md/20120728191235/http://www.codeguru.com/Cpp/COM-Tech/activex/apts/article.php/c5529/"><i>Understanding COM Apartments, Part I.</i></a> Archiviert vom <span class="dewiki-iconexternal"><a class="external text" href="https://redirecter.toolforge.org/?url=http%3A%2F%2Fwww.codeguru.com%2FCpp%2FCOM-Tech%2Factivex%2Fapts%2Farticle.php%2Fc5529%2F">Original</a></span><span>;</span><span class="Abrufdatum"> abgerufen am 1. Juli 2023</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rfr_id=info%3Asid%2Fde.wikipedia.org%3AComponent+Object+Model&rft.title=Understanding+COM+Apartments%2C+Part+I&rft.description=Understanding+COM+Apartments%2C+Part+I&rft.identifier=https%3A%2F%2Farchive.md%2F20120728191235%2Fhttp%3A%2F%2Fwww.codeguru.com%2FCpp%2FCOM-Tech%2Factivex%2Fapts%2Farticle.php%2Fc5529%2F&rft.source=http://www.codeguru.com/Cpp/COM-Tech/activex/apts/article.php/c5529/"> </span></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text"><span class="cite">Christian Gross: <a rel="nofollow" class="external text" href="https://msdn.microsoft.com/en-us/library/aa260790(v=vs.60).aspx"><i>Building COM Components on UNIX.</i></a> Microsoft, Juli 1998,<span class="Abrufdatum"> abgerufen am 29. Mai 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rfr_id=info%3Asid%2Fde.wikipedia.org%3AComponent+Object+Model&rft.title=Building+COM+Components+on+UNIX&rft.description=Building+COM+Components+on+UNIX&rft.identifier=https%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Faa260790%28v%3Dvs.60%29.aspx&rft.creator=Christian+Gross&rft.publisher=Microsoft&rft.date=1998-07&rft.language=en"> </span></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><span class="cite">Kersten Auel: <a rel="nofollow" class="external text" href="https://www.heise.de/newsticker/meldung/DCOM-fuer-Unix-jetzt-von-der-Open-Group-11429.html"><i>DCOM für Unix: jetzt von der Open Group.</i></a> Heise Medien, 8. März 1999,<span class="Abrufdatum"> abgerufen am 29. Mai 2016</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rfr_id=info%3Asid%2Fde.wikipedia.org%3AComponent+Object+Model&rft.title=DCOM+f%C3%BCr+Unix%3A+jetzt+von+der+Open+Group&rft.description=DCOM+f%C3%BCr+Unix%3A+jetzt+von+der+Open+Group&rft.identifier=https%3A%2F%2Fwww.heise.de%2Fnewsticker%2Fmeldung%2FDCOM-fuer-Unix-jetzt-von-der-Open-Group-11429.html&rft.creator=Kersten+Auel&rft.publisher=Heise+Medien&rft.date=1999-03-08"> </span></span>
</li>
</ol>
<div class="hintergrundfarbe1 rahmenfarbe1 navigation-not-searchable normdaten-typ-s" style="border-style: solid; border-width: 1px; clear: left; margin-bottom:1em; margin-top:1em; padding: 0.25em; overflow: hidden; word-break: break-word; word-wrap: break-word;" id="normdaten">
<div style="display: table-cell; vertical-align: middle; width: 100%;">
<div>
Normdaten (Sachbegriff): <a href="Gemeinsame_Normdatei" title="Gemeinsame Normdatei">GND</a>: <span class="-print"><a rel="nofollow" class="external text" href="https://d-nb.info/gnd/4489599-9">4489599-9</a></span> | <a href="Library_of_Congress_Control_Number" title="Library of Congress Control Number">LCCN</a>: <span class="-print"><a rel="nofollow" class="external text" href="https://id.loc.gov/authorities/sh98001683">sh98001683</a></span> </div>
</div></div></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-09-23" href="https://de.wikipedia.org/wiki/?title=Component_Object_Model&oldid=259997195">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>